给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
xxxxxxxxxx
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
x
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
xxxxxxxxxx
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
xxxxxxxxxx
输入: s = ""
输出: 0
提示:
利用双指针算法 或 滑动窗口算法
如何把所有情况都枚举到?
xxxxxxxxxx
在所有子串中 找 不包含重复字符的子串,
在不包含重复字符的子串中,找长度最大的。
所有情况可以分成n类,以子串的尾结点来分类。
子串尾结点在第0个位置,是第一类;
子串尾结点在第1个位置,是第二类;
..
以此类推
每次在1类中找最长的不含重复字符的子串。
如何在某1类中找最长的不含重复字符的子串?
从第1类到第n类的查找
xxxxxxxxxx
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// 统计每个字符出现的次数
unordered_map<char, int> heap;
int ans = 0;
// i 是右边的指针,j是左边的指针
for (int i = 0, j = 0; i < s.size(); i++) {
// 每次把s[i] 加入哈希表
heap[s[i]]++;
// 如果有重复一定是s[i],因为只有 s[i] 变多了
// j不断向后移动,直到新加入的s[i]不重复
while (heap[s[i]] > 1) {
// 哈希表中把j踢出去,j 向后移动
heap[s[j]]--;
j++;
}
// 移动完之后,当前从j到i是不包含重复字符的 (以i为结尾的这一段)
// 更新答案
ans = max(ans, i-j+1);
}
return ans;
}
};